<?php

/**
 * 
 * Autor				   : 	Juan Jose Muñiz Juarez
 * Fecha de Creacion	: 	22/04/2012,  02:09:31
 * Version 				: 	1.0
 * Descripcion 		:
 */

if ( !defined( "RUTA_FISICA_SISTEMA" ) )
  {
     require_once '../../../config/Constantes.php';
  }
  
$ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/";

require_once $ruta_sistema . 'general/clases/comun/archivos/OperacionArchivo.php';
require_once $ruta_sistema . 'general/clases/comun/logger/Log.php';
   
class FicheroIni
   {      
      private $_informacion;
      private $_acumular_informacion;
      private $_remplazar_contenido;
      private $_m_fichero_ini;
      private $_file_ini;
      private $_log;
      
      /**
       * 
       * Nombre         : 	__construct
       * Descripcion   	:	
       * Version 		:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	21/04/2012, 17:00:24
       * @param string $file_ini   :   Archivo donde se volcara la informacion de los pares clave=valor que se envien
       * @param bool $acumular_informacion   :   Bandera ques e utiliza para almacenar temporalmente la informacion en un
       *                                         arreglo, cuando se invoca el metodo setDatos, si esta desactivada entonces
       *                                         cada vez que se invoque el metodo setDatos, el contenido viejo se remplazara
       *                                         por el nuevo           
       * @param bool $remplazar_contenido   :   Bandera que indica si el contenido del archivo se va a remplazar totalmente
       *                                        o se añadira al final del archivo
       */
      function __construct ( $file_ini, $class = null, $acumular_informacion = false, $remplazar_contenido = false )
         {
            $this -> setFile_ini( $file_ini );
            
            if ( $acumular_informacion )
              {
                 $this -> setAcumular_informacion( $acumular_informacion );
                 $this ->_informacion = array();
              }  
              
             $this -> getLogger( $class ); 
         }

         /**
          * 
          * Nombre         	: 	getLogger
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	22/04/2012, 02:13:06
          * @param unknown_type $class
          */
       private function getLogger( $class )
         {
            if ( $this -> _log )
              {
                 $this -> _log -> setClass( $class );
              }
            else
              {
                 $this -> _log = new Logger( $class );
              }  
         }  
         
         /**
          *
          * Nombre         	: 	setDatos
          * Descripcion   	:	Permite almacenar la informacion de la clave y el valor para el archivo ini
          *                     Si se activa la opcion de acumular_informacion esta se almacenara en un arreglo
          *                     y cuando se invoque el metodo guardar se obtendran los valores guardados en el arreglo
          *                     en caso contrario, el valor se remplazara cada vez que se invoque el metodo
          * Version 		:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	21/04/2012, 16:54:42
          * @param M_FicheroIni $m_fichero_ini    :   Almacena el contenido de los pares clave = valor 
          */
      public function setDatos( $m_fichero_ini )
        {
           if ( !( $m_fichero_ini instanceof M_FicheroIni ) )
             {
                throw new Exception( "Solo se permite enviar objetos del tipo M_FicheroIni" );
             }
             
          $this -> setMFicheroIni( $m_fichero_ini );
          
          if ( $this -> _acumular_informacion )
            {
              if ( !$this -> _informacion )
               {
                 $this -> _informacion = array();
               }
          
               $this -> _informacion[] = $this ->_m_fichero_ini;
            }
        }   
	/**
     * @param field_type $_key
     */
      private function setMFicheroIni ( $m_fichero_ini )
         {
            $this->_m_fichero_ini = $m_fichero_ini;
         }
   	
	/**
     * @param field_type $_file_ini
     */
      private function setFile_ini ( $_file_ini )
         {
            $this->_file_ini = $_file_ini;
         }
         
      private function setRemplazar_contenido( $remplazar_contenido )
         {
            $this -> _remplazar_contenido = $remplazar_contenido;      
         }   


        /**
         * 
         * Nombre         	: 	guardar
         * Descripcion   	:	Almacena la informacion enviada al metodo setDatos y lo almacena en 
         *                      el fichero ini que se pase por parametro
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	21/04/2012, 17:12:07
         */
	  public function guardar( $class = null, $method = null, $line = null )
        {
            $this -> getLogger( $class == null ? $class : __CLASS__ );
            
            $this -> _log -> info( "Se va a proceder a guardar la informacion en el fichero INFO{" . $this -> _file_ini . "}",
                                   ( $method == null ? __METHOD__ : $method ),
                                   ( $line == null ? __LINE__ : $line )  );
           
            if ( $this -> _file_ini )
               {
                  $this -> eliminarFichero( $method, $line );
                  
                  if ( $this -> _acumular_informacion )
                     {
                        $this -> _log -> info( "Almacenando el contenido en el fichero INFO{" . $this -> _file_ini . "} con la opcion de acumulacion de informacion",
                                            ( $method == null ? __METHOD__ : $method ),
                                            ( $line == null ? __LINE__ : $line )  );
                        if ( $this -> _informacion )
                           {
                              if ( is_array ( $this -> _informacion ) && count ( $this -> _informacion ) > 0 )
                                 {
                                    foreach ( $this -> _informacion as $datos )
                                       {
                                          file_put_contents ( $this -> _file_ini, $datos -> getKey() . "=" . $datos -> getValue() );
                                       }
                                 }
                              else
                                 {
                                    file_put_contents ( $this -> _file_ini, $this -> _m_fichero_ini -> getKey() . "=" . $this -> _m_fichero_ini -> getValue() );
                                 }
                           }
                     }
                  else
                     {
                        $this -> _log -> info( "Almacenando el contenido en el fichero INFO{" . $this -> _file_ini . "}",
                                                ( $method == null ? __METHOD__ : $method ),
                                                ( $line == null ? __LINE__ : $line )  );
                        if ( $this -> _m_fichero_ini )
                           {
                              file_put_contents ( $this -> _file_ini, $this -> _m_fichero_ini -> getKey() . "=" . $this -> _m_fichero_ini -> getValue() );
                           }
                     }
               }
         }
         
         /**
          * 
          * Nombre         	: 	getContenidoFicheroIni
          * Descripcion   	:   Devuelve el contenido del fichero ini y devuelve un array asociativo	
          * Version 		:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora	:	22/04/2012, 01:47:20
          * @return multitype:|NULL
          */
       public function getContenidoFicheroIni( $method = null, $line = null )
         {
            if ( $this -> _file_ini )
              {
                 $this -> _log -> info( "Obteniendo el contenido del fichero INFO{" . $this -> _file_ini . "}",
                                         ( $method == null ? __METHOD__ : $method ),
                                         ( $line == null ? __LINE__ : $line )  );
                 if ( OperacionArchivo::existeArchivo( $this -> _file_ini ) )
                   {
                      return parse_ini_file( $this -> _file_ini );
                   }
              }
              
            return null;  
         }  

        /**
         * 
         * Nombre         	: 	eliminarFichero
         * Descripcion   	:	Si la opcion de remplazar_contenido esta activa, entonces antes de agregar el contenido 
         *                      elimina el archivo
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	21/04/2012, 17:07:51
         */
      private function eliminarFichero( $method = null, $line = null )
        {
           if ( $this -> _remplazar_contenido )
             {
                $this -> _log -> info( "Se va a proceder a eliminar el archivo ERROR{" . $this -> _file_ini . "}",
                                        ( $method == null ? __METHOD__ : $method ),
                                        ( $line == null ? __LINE__ : $line )  );
                                  
                OperacionArchivo::eliminarArchivo( $this -> _file_ini );
             }
        }  
   }
   